home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 1 / Cream of the Crop 1.iso / PROGRAM / DDJ0192.ARJ / FILEOPEN.C < prev    next >
Text File  |  1991-10-06  |  5KB  |  237 lines

  1. /* ----------- fileopen.c ------------- */
  2.  
  3. #include "dflat.h"
  4.  
  5. static int DlgFileOpen(char *, char *, DBOX *);
  6. static int DlgFnOpen(WINDOW, MESSAGE, PARAM, PARAM);
  7. static void InitDlgBox(WINDOW);
  8. static void StripPath(char *);
  9. static int IncompleteFilename(char *);
  10.  
  11. static char *OrigSpec;
  12. static char *FileSpec;
  13. static char *FileName;
  14.  
  15. static int Saving;
  16. extern DBOX FileOpen;
  17. extern DBOX SaveAs;
  18.  
  19. /*
  20.  * Dialog Box to select a file to open
  21.  */
  22. int OpenFileDialogBox(char *Fpath, char *Fname)
  23. {
  24.     return DlgFileOpen(Fpath, Fname, &FileOpen);
  25. }
  26.  
  27. /*
  28.  * Dialog Box to select a file to save as
  29.  */
  30. int SaveAsDialogBox(char *Fname)
  31. {
  32.     return DlgFileOpen(NULL, Fname, &SaveAs);
  33. }
  34.  
  35. /* --------- generic file open ---------- */
  36. static int DlgFileOpen(char *Fpath, char *Fname, DBOX *db)
  37. {
  38.     int  rtn;
  39.     char savedir[80];
  40.     char OSpec[80];
  41.     char FSpec[80];
  42.     char FName[80];
  43.  
  44.     OrigSpec = OSpec;
  45.     FileSpec = FSpec;
  46.     FileName = FName;
  47.  
  48.     getcwd(savedir, sizeof savedir);
  49.     if (Fpath != NULL)    {
  50.         strncpy(FileSpec, Fpath, 80);
  51.         Saving = FALSE;
  52.     }
  53.     else    {
  54.         *FileSpec = '\0';
  55.         Saving = TRUE;
  56.     }
  57.     strcpy(FileName, FileSpec);
  58.     strcpy(OrigSpec, FileSpec);
  59.  
  60.     if ((rtn = DialogBox(NULL, db, TRUE, DlgFnOpen)) != FALSE)
  61.         strcpy(Fname, FileName);
  62.     else
  63.         *Fname = '\0';
  64.  
  65.     setdisk(toupper(*savedir) - 'A');
  66.     chdir(savedir);
  67.  
  68.     return rtn;
  69. }
  70.  
  71. /*
  72.  *  Process dialog box messages
  73.  */
  74. static int DlgFnOpen(WINDOW wnd, MESSAGE msg, PARAM p1, PARAM p2)
  75. {
  76.     switch (msg)    {
  77.         case CREATE_WINDOW:    {
  78.             int rtn = DefaultWndProc(wnd, msg, p1, p2);
  79.             DBOX *db = wnd->extension;
  80.             WINDOW cwnd = ControlWindow(db, ID_FILENAME);
  81.             SendMessage(cwnd, SETTEXTLENGTH, 64, 0);
  82.             return rtn;
  83.         }
  84.         case INITIATE_DIALOG:
  85.             InitDlgBox(wnd);
  86.             break;
  87.         case COMMAND:
  88.             switch ((int) p1)    {
  89.                 case ID_FILENAME:
  90.                     if (p2 != ENTERFOCUS)    {
  91.                         /* allow user to modify the file spec */
  92.                         GetItemText(wnd, ID_FILENAME,
  93.                                 FileName, 65);
  94.                         if (IncompleteFilename(FileName) || Saving)    {
  95.                             strcpy(OrigSpec, FileName);
  96.                             StripPath(OrigSpec);
  97.                         }
  98.                         if (p2 != LEAVEFOCUS)
  99.                             SendMessage(wnd, COMMAND, ID_OK, 0);
  100.                     }
  101.                     return TRUE;
  102.                 case ID_OK:
  103.                     if (p2 != 0)
  104.                         break;
  105.                     GetItemText(wnd, ID_FILENAME,
  106.                             FileName, 65);
  107.                     strcpy(FileSpec, FileName);
  108.                     if (IncompleteFilename(FileName))    {
  109.                         /* no file name yet */
  110.                         InitDlgBox(wnd);
  111.                         strcpy(OrigSpec, FileSpec);
  112.                         return TRUE;
  113.                     }
  114.                     else    {
  115.                         GetItemText(wnd, ID_PATH, FileName, 65);
  116.                         strcat(FileName, FileSpec);
  117.                     }
  118.                     break;
  119.                 case ID_FILES:
  120.                     switch ((int) p2)    {
  121.                         case ENTERFOCUS:
  122.                         case LB_SELECTION:
  123.                             /* selected a different filename */
  124.                             GetDlgListText(wnd, FileName,
  125.                                         ID_FILES);
  126.                             PutItemText(wnd, ID_FILENAME,
  127.                                             FileName);
  128.                             break;
  129.                         case LB_CHOOSE:
  130.                             /* chose a file name */
  131.                             GetDlgListText(wnd, FileName,
  132.                                     ID_FILES);
  133.                             SendMessage(wnd, COMMAND, ID_OK, 0);
  134.                             break;
  135.                         default:
  136.                             break;
  137.                     }
  138.                     return TRUE;
  139.                 case ID_DRIVE:
  140.                     switch ((int) p2)    {
  141.                         case ENTERFOCUS:
  142.                             if (Saving)
  143.                                 *FileSpec = '\0';
  144.                             break;
  145.                         case LEAVEFOCUS:
  146.                             if (Saving)
  147.                                 strcpy(FileSpec, FileName);
  148.                             break;
  149.                         case LB_SELECTION:    {
  150.                             char dd[25];
  151.                             /* selected different drive/dir */
  152.                             GetDlgListText(wnd, dd,
  153.                                                 ID_DRIVE);
  154.                             if (*(dd+2) == ':')
  155.                                 *(dd+3) = '\0';
  156.                             else
  157.                                 *(dd+strlen(dd)-1) = '\0';
  158.                             strcpy(FileName, dd+1);
  159.                             if (*(dd+2) != ':' && *OrigSpec != '\\')
  160.                                 strcat(FileName, "\\");
  161.                             strcat(FileName, OrigSpec);
  162.                             if (*(FileName+1) != ':' && *FileName != '.')    {
  163.                                 GetItemText(wnd, ID_PATH, FileSpec, 65);
  164.                                 strcat(FileSpec, FileName);
  165.                             }
  166.                             else 
  167.                                 strcpy(FileSpec, FileName);
  168.                             break;
  169.                         }
  170.                         case LB_CHOOSE:
  171.                             /* chose drive/dir */
  172.                             if (Saving)
  173.                                 PutItemText(wnd, ID_FILENAME, "");
  174.                             InitDlgBox(wnd);
  175.                             return TRUE;
  176.                         default:
  177.                             break;
  178.                     }
  179.                     PutItemText(wnd, ID_FILENAME, FileSpec);
  180.                     return TRUE;
  181.  
  182.  
  183.                 default:
  184.                     break;
  185.             }
  186.         default:
  187.             break;
  188.     }
  189.     return DefaultWndProc(wnd, msg, p1, p2);
  190. }
  191.  
  192. /*
  193.  *  Initialize the dialog box
  194.  */
  195. static void InitDlgBox(WINDOW wnd)
  196. {
  197.     if (*FileSpec && !Saving)
  198.         PutItemText(wnd, ID_FILENAME, FileSpec);
  199.     if (DlgDirList(wnd, FileSpec, ID_FILES, ID_PATH, 0))    {
  200.         StripPath(FileSpec);
  201.         DlgDirList(wnd, "*.*", ID_DRIVE, 0, 0xc010);
  202.     }
  203. }
  204.  
  205. /*
  206.  * Strip the drive and path information from a file spec
  207.  */
  208. static void StripPath(char *filespec)
  209. {
  210.     char *cp, *cp1;
  211.  
  212.     cp = strchr(filespec, ':');
  213.     if (cp != NULL)
  214.         cp++;
  215.     else
  216.         cp = filespec;
  217.     while (TRUE)    {
  218.         cp1 = strchr(cp, '\\');
  219.         if (cp1 == NULL)
  220.             break;
  221.         cp = cp1+1;
  222.     }
  223.     strcpy(filespec, cp);
  224. }
  225.  
  226.  
  227. static int IncompleteFilename(char *s)
  228. {
  229.     int lc = strlen(s)-1;
  230.     if (strchr(s, '?') || strchr(s, '*') || !*s)
  231.         return TRUE;
  232.     if (*(s+lc) == ':' || *(s+lc) == '\\')
  233.         return TRUE;
  234.     return FALSE;
  235. }
  236.  
  237.